package cn.bonoon.kernel.menus;

import java.util.Collection;

/**
 * <pre>
 * 用于管理整个框架的子系统及菜单；整个菜单定义的结构如下：
 * <table><tr><td>系统 -> 子系统 -> 频道</td><td> -> 菜单 -> 子菜单</td></tr><tr><td></td><td> -> tabs</td></tr></table>
 * 用户访问菜单定义分两种情况：
 * 1. 超级管理员，即用户身份为超级管理员；则没有限制
 * 2. 一般管理员和普通用户，则需要根据用户的角色进行操作权限的限制
 * </pre>
 * @author jackson
 *
 */
public interface ModuleManager extends ISystem, IHost, IStyleGetter{
	
	String CONFIG_USER 		= "user.config.";
	String CONFIG_MANAGER 	= "manager.config.";
	String CONFIG_SUPER 	= "super.config.";

	ILoginInfo loginInfo();
	/**
	 * 取得所有已经定义的子系统的信息
	 * 
	 * @return
	 */
	Collection<ModuleInfo> modules();

	String targetUrl(String id);

	String getEndpoint();
	
	String getDefaultEndpoint();

	/**
	 * <pre>
	 * 根据当前页面访问的信息来对菜单(包括频道)进行查找；
	 * 先根据页面访问解析出来的菜单id进行查找；
	 * 如果菜单id查找不到，则根据访问的路径再进行查找；
	 * </pre>
	 * @param urlRequest
	 * @return
	 */
	ItemInfo find(UrlRequest urlRequest);

	/**
	 * @return 返回系统
	 */
	IModuleInfo module();
	
	/**
	 * 根据子系统的ID取得子系统的信息
	 * 
	 * @param key
	 * @return
	 */
	IModuleInfo module(String key);

	ItemInfo item(String id);
	
	MenuInfo menu(String id);

	TabInfo tab(String id);

	TabItem tabItem(String id);

	Collection<TabItem> tabItems();
	
	/**
	 * <pre>
	 * 系统定义的个人中心的频道
	 * </pre>
	 * @return
	 */
	ChannelInfo personalCenter();
	
	ChannelInfo getChannelManager();
	
	IShortcutInfo shortcut(String id);
	
	ItemInfo find(String modulekey, String channalid, String...menuid);
}
